package com.sgs.carbon.web.modules.common.dal.dataobject.logger;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.sgs.carbon.common.pojo.CommonResult;
import com.sgs.carbon.starter.mybatis.core.dataobject.BaseDO;
import com.sgs.carbon.starter.operatelog.core.enums.OperateTypeEnum;
import com.sgs.carbon.web.modules.common.dal.dataobject.user.SysUserDO;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Date;
import java.util.Map;

/**
 * 操作日志表
 *
 * @author Dave Liu
 * @date 2021-10-06
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName(value = "sys_operate_log", autoResultMap = true)
public class SysOperateLogDO extends BaseDO {

    /**
     * {@link #javaMethodArgs} 的最大长度
     */
    public static final Integer JAVA_METHOD_ARGS_MAX_LENGTH = 8000;

    /**
     * {@link #resultData} 的最大长度
     */
    public static final Integer RESULT_MAX_LENGTH = 4000;

    /**
     * 日志主键
     */
    @TableId
    private Long id;

    /**
     * 用户编号
     *
     * {@link SysUserDO#getId()}
     */
    private Long userId;

    /**
     * 操作模块
     */
    private String module;

    /**
     * 操作名
     */
    private String name;

    /**
     * 操作分类
     *
     * 枚举 {@link OperateTypeEnum}
     */
    @TableField("operate_type")
    private Integer type;

    /**
     * 操作内容, 记录整个操作的明细
     * 例如: 修改编号为 1 的用户信息, 将性别从男改成女
     */
    private String content;

    /**
     * 拓展字段, 有些复杂的业务, 需要记录一些字段
     * 例如: 记录订单编号, 则可以添加 key 为 "orderId", value 为订单编号
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private Map<String, Object> exts;

    /**
     * 请求方法名
     */
    private String requestMethod;

    /**
     * 请求地址
     */
    private String requestUrl;

    /**
     * 用户 IP
     */
    private String userIp;

    /**
     * 浏览器 UA
     */
    private String userAgent;

    /**
     * Java 方法名
     */
    private String javaMethod;

    /**
     * Java 方法的参数
     *
     * 实际格式为 Map<String, Object>, 不使用 @TableField(typeHandler = FastjsonTypeHandler.class)
     * 注解的原因是数据库存储有长度限制, 会进行裁剪, 会导致 JSON 反序列化失败
     *
     * 其中key 为参数名, value 为参数值
     */
    private String javaMethodArgs;

    /**
     * 开始时间
     */
    private Date startTime;

    /**
     * 执行时长, 单位：毫秒
     */
    private Integer duration;

    /**
     * 结果码
     *
     * 目前使用的 {@link CommonResult#getCode()} 属性
     */
    private Integer resultCode;

    /**
     * 结果提示
     *
     * 目前使用的 {@link CommonResult#getMsg()} 属性
     */
    private String resultMsg;

    /**
     * 结果数据
     *
     * 如果是对象, 则使用 JSON 格式化
     */
    private String resultData;

}
